package main.proyecto_pei;

import java.util.ArrayList;
import utilities.BDSQLiteHelper;
import utilities.Llamada;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentUris;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;



public class DetalleLlamadas extends Activity{ 
	ListView listView;
    EditText editText;
    private ArrayList<Llamada> sortLlamadas = new ArrayList<Llamada>();
    ArrayList<Llamada> llamadas = new ArrayList<Llamada>();
    int textlength=0;
    
    @Override
	public void onConfigurationChanged(Configuration newConfig) {
	    super.onConfigurationChanged(newConfig);
	}
    
	@Override
	public void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
    	setContentView(R.layout.detalle_llamadas);
    	editText = (EditText)findViewById(R.id.editTextLlam);
    	listView = (ListView)findViewById(R.id.ListLlamadas);
    	
    	//Llenamos el array llamadas invocando este metodo:
    	getLlamadas();
    	AdaptadorLlamadas adaptador = new AdaptadorLlamadas(this);
        listView.setAdapter(adaptador);
         
        /**
         * Evento onChange del EditText de busqueda en el listado de llamadas 
         */
         editText.addTextChangedListener(new TextWatcher() { 			
 			public void afterTextChanged(Editable s) {		} 			
 			public void beforeTextChanged(CharSequence s, int start, int count,int after) {		} 		
 			public void onTextChanged(CharSequence s, int start, int before,int count) {
 				textlength=editText.getText().length();
 				sortLlamadas.clear();
 				for(int i=0;i<llamadas.size();i++){
 					if(textlength<=llamadas.get(i).getNombre().length()){
 	 					//Busqueda por el nombre (si tiene)
 						if(editText.getText().toString().equalsIgnoreCase((String) llamadas.get(i).getNombre().subSequence(0, textlength))){
 							sortLlamadas.add(new Llamada(llamadas.get(i).getId(),llamadas.get(i).getNombre(),llamadas.get(i).getNumero(), llamadas.get(i).getDuracion(), llamadas.get(i).getFecha(),llamadas.get(i).getImgUri(),llamadas.get(i).getCompania()));
 						}
 	 					//Busqueda por el numero
 						else if(editText.getText().toString().equalsIgnoreCase((String) llamadas.get(i).getNumero().subSequence(0, textlength))){
	 							sortLlamadas.add(new Llamada(llamadas.get(i).getId(),llamadas.get(i).getNombre(),llamadas.get(i).getNumero(), llamadas.get(i).getDuracion(), llamadas.get(i).getFecha(),llamadas.get(i).getImgUri(),llamadas.get(i).getCompania()));
	 						}
 					}
 				}
 				//lv.setAdapter(new ArrayAdapter<String>(DemoListView.this,android.R.layout.simple_list_item_1 , arr_sort));
 				listView.setAdapter(new AdaptadorSortLlamadas(DetalleLlamadas.this));
 			}
 		});

         listView.setOnItemClickListener(new OnItemClickListener() {
             public void onItemClick(AdapterView<?> parent, View v, int posicion, long id) {
            	 mostrarDetalle(listView.getItemAtPosition(posicion));
             }
         });
         
         listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){
         	public boolean onItemLongClick(AdapterView<?> av, View v, int pos, long id) {
         		onLongListItemClick(v,pos,id);
         		return false;
         	}
         }); 
         
         
         
         
         
         
              
 	/********************************************************************/
 	/**						FUNCIONES DE BOTONES						*/
 	/********************************************************************/
         
    	
	}
	
	protected void onLongListItemClick(View v, final int pos, long id) {
		eliminarLlamada(pos);
		
	}
	
	public void onClickRegresar(View v){
		Intent principal = new Intent();
		principal.setClass(this,Calculos.class);
		finish();
	}
	
	
	/********************************************************************/
 	/**								ADAPTADOR							*/
 	/********************************************************************/
	 
	@SuppressWarnings("rawtypes")
	class AdaptadorLlamadas extends ArrayAdapter {
	    	
	    	Activity context;
	    	
	    	@SuppressWarnings("unchecked")
			AdaptadorLlamadas(Activity context) {
	    		super(context,0, llamadas);
	    		this.context = context;
	    	}
	    	
	    	@Override
			public View getView(final int position, final View convertView, ViewGroup parent) {
	    		String nombre = llamadas.get(position).getNombre();
	    		String numero = llamadas.get(position).getNumero();
	    		String fecha = llamadas.get(position).getFechaLLamada();
				LayoutInflater inflater = context.getLayoutInflater();
				View item = inflater.inflate(R.layout.list_llamadas, null);
				ImageView imgv = (ImageView)item.findViewById(R.id.btnDeleteLlamadas);
				ImageView imgc = (ImageView)item.findViewById(R.id.imgFotoLlamada);
				Uri uritemp = llamadas.get(position).getImgUri();
				
				if(llamadas.get(position).getImgUri()!=null) imgc.setImageURI(uritemp);
				
				TextView lblNombre = (TextView)item.findViewById(R.id.LblNombre);
				TextView lblNumero = (TextView)item.findViewById(R.id.LblNumero);
				TextView lblFecha = (TextView)item.findViewById(R.id.LblFecha);
				if(nombre==null || "".equals(nombre)){
					lblNombre.setText(numero);
					lblNumero.setText(fecha);
					lblFecha.setText("");
				}
				else{
					lblNombre.setText(nombre);
					lblNumero.setText(numero);
					lblFecha.setText(fecha);
				}
				imgv.setOnClickListener(new OnClickListener() {
			        public void onClick(View v) {
			        	eliminarLlamada(position);
			        }
			    });
				return(item);
			}
	    }
	
	
	@SuppressWarnings("rawtypes")
	class AdaptadorSortLlamadas extends ArrayAdapter {
    	
    	Activity context;
    	
    	@SuppressWarnings("unchecked")
		AdaptadorSortLlamadas(Activity context) {
    		super(context, 0, sortLlamadas);
    		this.context = context;
    	}
    	
    	@Override
		public View getView(int position, View convertView, ViewGroup parent) {
    		String nombre = sortLlamadas.get(position).getNombre();
    		String numero = sortLlamadas.get(position).getNumero();
    		String fecha = sortLlamadas.get(position).getFechaLLamada();
    		
			LayoutInflater inflater = context.getLayoutInflater();
			View item = inflater.inflate(R.layout.list_llamadas, null);
						
			ImageView imgc = (ImageView)item.findViewById(R.id.imgFotoLlamada);
			if(sortLlamadas.get(position).getImgUri()!=null) imgc.setImageURI(sortLlamadas.get(position).getImgUri());
			
			TextView lblNombre = (TextView)item.findViewById(R.id.LblNombre);
			TextView lblNumero = (TextView)item.findViewById(R.id.LblNumero);
			TextView lblFecha = (TextView)item.findViewById(R.id.LblFecha);
			if(nombre==null || "".equals(nombre)){
				lblNombre.setText(numero);
				lblNumero.setText(fecha);
				lblFecha.setText("");
			}
			else{
				lblNombre.setText(nombre);
				lblNumero.setText(numero);
				lblFecha.setText(fecha);
			}
			return(item);
		}
    }
	
	
	
	/********************************************************************/
	/**						FUNCIONES DE VARIAS							*/
	/********************************************************************/
	
	private void eliminarLlamada(final int pos){
		AlertDialog dialog;
		
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("Eliminar Registro");
		builder.setIcon(R.drawable.warning);
		builder.setMessage("Desea eliminar el registro seleccionado?")
		.setCancelable(false)
		
		.setPositiveButton("Si", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int id) {
				eliminarLLamadaBD(llamadas.get(pos).getId());
				llamadas.remove(pos);
				listView.setAdapter(new AdaptadorLlamadas(DetalleLlamadas.this));
			}
		})
		
		.setNegativeButton("No", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int id) {
				dialog.cancel();
			}
			});
		dialog = builder.create();
		dialog.show();
	}
	
	private void eliminarLLamadaBD(int id){
		BDSQLiteHelper usdbh = new BDSQLiteHelper(DetalleLlamadas.this, "DB_PEI", null, 1);
		SQLiteDatabase db = null;
		try {
			db = usdbh.getWritableDatabase();
			db.execSQL("UPDATE PEI_LLAMADA SET EST_ESTADO=0 WHERE ID_LLAMADA='"+id+"';");
		} catch (Exception e) {
			e.printStackTrace();
			Log.i("ERROR ELIMINARALERTA", e.getMessage());
		}
		finally{
			db.close();
		}
	}

	
	
	/**
	 * @author Fabrizzio
	 * Metodo para obtener el registro de llamadas
	 */
		
	public void getLlamadas() {
		BDSQLiteHelper bdh = new BDSQLiteHelper(DetalleLlamadas.this, "DB_PEI", null, 1);
		SQLiteDatabase db = null;
		int _id;
		try{
			db = bdh.getReadableDatabase();
			//int id,String nombre, String numero, int duracion, Date callDayTime,Uri imgUri,String compania) {
			Cursor c = db.query("PEI_LLAMADA", new String[]{"ID_LLAMADA","NOMBRE_CONTACTO","NUMERO","DURACION","FECHA","PROVEEDOR_DESTINO","ID_CONTACTO"}, "EST_ESTADO=1", null, null, null, "FECHA DESC");
			while(c.moveToNext()){
				_id = c.getInt(0);
				llamadas.add(new Llamada(_id,
						c.getString(1),
						c.getString(2),
						c.getInt(3), 
						c.getLong(4),
						getPhotoUri(c.getInt(6)),
						c.getString(5)));
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		finally{
			db.close();
		}
		
	}
	
//	private Long getFecha(String p){//dd/mm/yyyy hh:mm:ss
//		try{
//		String[] aux = p.split(" ");
//		String[] fecha = aux[0].split("/");
//		String[] hora = aux[1].split(":");
//
//		Date f = new Date(Integer.parseInt(fecha[2]),
//				Integer.parseInt(fecha[1]),
//				Integer.parseInt(fecha[0]),
//				Integer.parseInt(hora[0]),
//				Integer.parseInt(hora[1]),
//				Integer.parseInt(hora[2]));
//		Log.i("mm-sv","lon="+f.getTime()+"     date="+new Date(f.getTime()).toString());
//		return f.getTime();
//		}catch(Exception e){
//			e.printStackTrace();
//		}
//		return null;
//	}
//	
	
	public void mostrarDetalle(Object o){
		Llamada llam = (Llamada) o;
		String msj="";
		String nombre = llam.getNombre();
		if(!nombre.equals("")) msj+="Nombre: "+nombre+"\n";
		msj+=getString(R.string.lblNumeroDetLlamada)+llam.getNumero()+"\n";
		msj+=getString(R.string.lblDuracionDetLlamada)+llam.getDuracion()+"seg"+"\n";
		msj+=getString(R.string.lblCompaniaDetLlamada)+getCompania(llam.getNumero())+"\n";
		msj+=getString(R.string.lblFechaDetLlamada)+llam.getFechaLLamada()+"\n";
		
		AlertDialog alertDialog = new AlertDialog.Builder(DetalleLlamadas.this).create();
        alertDialog.setTitle("Detalle");
        alertDialog.setMessage(msj);
        alertDialog.setIcon(R.drawable.call);
        alertDialog.setButton("Aceptar", new DialogInterface.OnClickListener() {
        	public void onClick(DialogInterface dialog, int which) {}
        });
        alertDialog.show();
	}
	
	
	public String getCompania(String number) {
		int n;
		String num = number.replaceFirst("-", "");
		num = num.replaceFirst("503", "");
		num = num.replaceFirst("\\+", "");
		if(num.length()!=8 || num.charAt(0)!='7'){
			return "Desconocido";
		}
        num = num.substring(0,4);
        n = Integer.parseInt(num);
        
        if(((n>=7000)&&(n<=7099))||                  
             ((n>=7600)&&(n<=7669))||
             ((n>=7687)&&(n<=7690))||
             ((n>=7740)&&(n<=7759))||
             ((n>=7805)&&(n<=7809))||
             ((n>=7840)&&(n<=7844))||
             ((n>=7850)&&(n<=7869))||
             ((n>=7950)&&(n<=7969))||
             ((n>=7985)&&(n<=7989))){
                        return "CLARO";           
        }
                                                
        if(((n>=7300)&&(n<=7399))||                                        
                ((n>=7400)&&(n<=7449))||                                                                           
                ((n>=7460)&&(n<=7469))||
                ((n>=7695)&&(n<=7698))||
                ((n>=7760)&&(n<=7779))||
                ((n>=7970)&&(n<=7979))){
                 return "DIGICEL";                         
        }

        if(((n>=7100)&&(n<=7199))||
                  ((n>=7450)&&(n<=7459))||
                  ((n>=7691)&&(n<=7694))||
              ((n>=7700)&&(n<=7719))||
              ((n>=7780)&&(n<=7784))||
              ((n>=7790)&&(n<=7794))||
              ((n>=7810)&&(n<=7839))||
              ((n>=7845)&&(n<=7849))||
              ((n>=7990)&&(n<=7999))){
                return "MOVISTAR";
        }
        
        if(((n>=7200)&&(n<=7299))||
             ((n>=7470)&&(n<=7499))||
             ((n>=7500)&&(n<=7599))||                        
             ((n>=7670)&&(n<=7679))||
             ((n>=7680)&&(n<=7683))||
             ((n>=7720)&&(n<=7739))||
             ((n>=7785)&&(n<=7789))||
             ((n>=7795)&&(n<=7799))||
             ((n>=7870)&&(n<=7899))||
             ((n>=7900)&&(n<=7949))){
                        return "TIGO";

                }
        return "Desconocido";
	}
	
	public Uri getPhotoUri(Integer idContacto) {
	    try {	    	
	        Cursor cur = this.getContentResolver().query(
	        		ContactsContract.Data.CONTENT_URI, 
	        		null,
	                ContactsContract.Data.CONTACT_ID + "=" + idContacto + " AND "+ ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'", 
	                null,
	                null);
	        if (!cur.moveToFirst()) return null; // no photo
	        Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(idContacto+""));
		    return Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
	    } catch (Exception e) {
	        e.printStackTrace();
	        return null;
	    }
	}

	
	@Override  
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_llamadas, menu);
        return true;
    }
    
  
    @Override    
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_llamadas:
            	AlertDialog dialog;
        		AlertDialog.Builder builder = new AlertDialog.Builder(this);
        		builder.setTitle("¿Borrar Llamadas?");
        		builder.setIcon(R.drawable.warning);
        		builder.setMessage("¿Confirma eliminar todo el historial de llamadas?")
        		.setCancelable(false)				
        		.setPositiveButton("Aceptar", new DialogInterface.OnClickListener() {
        			public void onClick(DialogInterface dialog, int id) {
        				eliminar();
        				dialog.cancel();
        			}
        			})
        			.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
        			public void onClick(DialogInterface dialog, int id) {
        				dialog.cancel();
        			}
        			});
        		dialog = builder.create();
        		dialog.show();
            	return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
    
    
	private void eliminar(){
		BDSQLiteHelper usdbh = new BDSQLiteHelper(DetalleLlamadas.this, "DB_PEI", null, 1);
		SQLiteDatabase db = null;
		try {
			db = usdbh.getWritableDatabase();
			db.execSQL("UPDATE PEI_LLAMADA SET EST_ESTADO=0");
			llamadas.clear();
			listView.setAdapter(new AdaptadorLlamadas(DetalleLlamadas.this));
		} catch (Exception e) {
			e.printStackTrace();
			Log.i("ERROR ELIMINARALERTA", e.getMessage());
		}
		finally{
			db.close();
		}
	}
	

}
